﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "IEventArgs.h"
#include "GcmpUiViewInterface.h"

namespace gcmp
{
    /// \brief 定义视图类鼠标事件类型。
    /// IUiViewMouseEvent视图类事件是事后触发，如果平台已有默认行为，注册该事件不会改变平台的默认行为，
    /// 只能在默认行为的基础上添加其他行为。
    enum class UiViewMouseEventType : int32_t
    {
        Move,                        ///< 鼠标移动触发此事件
        LeftButtonDown,              ///< 鼠标左键按下触发此事件
        LeftButtonUp,                ///< 鼠标左键弹起触发此事件
        LeftButtonDoubleClick,       ///< 鼠标左键双击触发此事件
        RightButtonDown,             ///< 鼠标右键按下触发此事件
        RightButtonUp,               ///< 鼠标右键弹起触发此事件
        MiddleButtonDown,            ///< 鼠标中键按下触发此事件  
        MiddleButtonUp,              ///< 鼠标中键弹起触发此事件   
        MiddleButtonDoubleClick,     ///< 鼠标中键双击触发此事件
        Hover,                       ///< 鼠标Hover触发此事件
        Wheel,                        ///< 鼠标Wheel触发此事件
        HoverWithoutPick             ///< 在没有pick时，鼠标hover触发此事件
    };

    class IUiView;
    class Vector3d;

    /// \brief 视图类鼠标事件参数的接口。
    class GCMP_UI_VIEW_INTERFACE_EXPORT IUiViewMouseEventArgs : public IEventArgs
    {
        DEFINE_CAST_DERIVED(gcmp::IUiViewMouseEventArgs, gcmp::IEventArgs)

    public:
        /// \brief 获取视图类鼠标事件类型。
        /// 
        /// \return 返回视图类鼠标事件类型。
        virtual UiViewMouseEventType GetType() const = 0;

        /// \brief 获取鼠标位置。
        virtual Vector3d GetMousePosition() const = 0;

        /// \brief 获取鼠标滚动增幅
        virtual int GetMouseWheelDelta() const = 0;

        /// \brief 获取视图鼠标Hover时的提示信息
        /// \param elementId 预选择的对象
        /// \param pTooltip  提示信息
        /// \return  获取提示信息成果返回true，否则返回false
        virtual bool GetHoverTooltip(ElementId &elementId, std::wstring *&pTooltip) const = 0;

        /// \brief 获取提示信息
        virtual const std::wstring & GetTooltip() const = 0;

        /// \brief 设置hover的element
        /// \param elementId 预选择的对象
        virtual void SetHoverElementId(const ElementId& elementId) = 0;

        /// \brief 设置视图鼠标Hover时的显示选项。
        /// \param wantElementId 需要ElementId。
        /// 默认会根据产品类型ProductType做判断（只在开发版里有）。
        static void SetHoverTooltipOptions(bool wantElementId);

        /// \brief 获取视图鼠标Hover时的显示选项。
        /// \param wantElementId 获取是否需要ElementId。
        static void GetHoverTooltipOptions(bool & wantElementId);
    };

}

